/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.kuncipenyusunananggaran;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.sadhar.sia.common.ClassConnection;
import org.sadhar.sia.common.ClassUtility;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.zkoss.zul.Messagebox;

/**
 *
 * @author Daud_HS
 * --revised Dewi (BAPSI)
 */
public class KunciPenyusunanAnggaranDAOImpl implements KunciPenyusunanAnggaranDAO {

    public KunciPenyusunanAnggaranDAOImpl() {
        ClassConnection.getTransactionProxyFactoryBean().setTarget(this);
    }

    /**
     * Untuk melakukan pengecekan apakah data kunciPenyusunanAnggaran sudah ada atau belum
     * @param data
     * @return
     */
    public String cekKunciAnggaran(KunciPenyusunanAnggaran data) {
        String xStr = "select kodeUnit "
                + "from ppmk.kunciAnggaranBiaya "
                + "where tahunAnggaran = '" + data.getTahunAnggaran() + "' "
                + "and kodeUnit = '" + data.getKodeUnit() + "' "
                + "and kodeJenisAnggaran = '" + data.getKdJenisAnggaran() + "' "
                + "and isRevisi = '" + data.getIsRevisi() + "'";
        SqlRowSet rs = (SqlRowSet) ClassConnection.getJdbc().queryForRowSet(xStr);
        if (rs.next()) {
            return rs.getString("kodeUnit");
        } else {
            return "";
        }
    }

//    public List<Map> getKunciByTahun(String tahun) throws Exception {
//        String sql = "SELECT * FROM  ppmk.kunciAnggaranBiaya,ppmk.jenisBiaya,kamus.unkerja " +
//                "WHERE  ppmk.jenisBiaya.kodeJenisBiaya=ppmk.kunciAnggaranBiaya.kodeJenisAnggaran AND " +
//                "kamus.unkerja.Kd_unit_kerja=ppmk.kunciAnggaranBiaya.kodeUnit " +
//                "and ppmk.kunciAnggaranBiaya.tahunAnggaran = '"+tahun+"'";
//        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{tahun});
//        String currentPosPendapatan = "";
//        String currentNama = "";
//        for (Map map : result) {
//            if (currentPosPendapatan.equalsIgnoreCase(map.get("Nama_unit_kerja").toString())) {
//                map.put("Nama_unit_kerja", "");
//                map.put("Nama_unit_kerja", currentPosPendapatan);
//            } else {
//                currentPosPendapatan = map.get("Nama_unit_kerja").toString();
//                map.put("Nama_unit_kerja", "");
//
//            }
//            if (currentNama.equalsIgnoreCase(map.get("jenisBiaya").toString())) {
//                map.put("jenisBiaya", "");
//                map.put("jenisBiaya", currentNama);
//            } else {
//                currentNama = map.get("jenisBiaya").toString();
//                map.put("jenisBiaya", "");
//            }
//
//        }
//        return result;
//    }
    /**
     * Digunakan untuk mendapatkan tahunAnggaran yang distinct dari tabel ppmk.kunciAnggaranBiaya
     * berdasarkan tahunAnggaran
     * @param tahun merupakan parameter yang menunjuk pada kolom tahunAnggaran
     * @return
     * @throws Exception
     */
    public List<Map> getTahunAnggaranPendapatanUnit(String tahun) throws Exception {
        String sql = "SELECT distinct tahunAnggaran FROM ppmk.kunciAnggaranBiaya where tahunAnggaran <> ?";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{tahun});
        return result;
    }

    /**
     * Digunakan untuk mendapatkan nama unit kerja, jenis biaya dari tabel ppmk.jenisBiaya,
     * ppmk.kunciAnggaranBiaya,ppmk.kamus.unkerja dengan berdasarkan tahun
     * @param tahun sebagai parameter yang menunjuk pada kolom tahunAnggaran
     * pada tabel ppmk.kunciAnggaranBiaya
     * @return
     * @throws Exception
     */
    public List<Map> getUnitKerjaAndPendapatanByTahun(String tahun) throws Exception {
        String sql = "SELECT * FROM  ppmk.kunciAnggaranBiaya,ppmk.jenisBiaya,kamus.unkerja "
                + "WHERE  ppmk.jenisBiaya.kodeJenisBiaya=ppmk.kunciAnggaranBiaya.kodeJenisAnggaran AND "
                + "kamus.unkerja.Kd_unit_kerja=ppmk.kunciAnggaranBiaya.kodeUnit "
                + "and ppmk.kunciAnggaranBiaya.tahunAnggaran =?";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{tahun});
        String currentPosPendapatan = "";
        String currentNama = "";
        for (Map map : result) {
            if (currentPosPendapatan.equalsIgnoreCase(map.get("Nama_unit_kerja").toString())) {
                map.put("Nama_unit_kerja", "");
//                map.put("Nama_unit_kerja", currentPosPendapatan);
            } else {
                currentPosPendapatan = map.get("Nama_unit_kerja").toString();
//                map.put("Nama_unit_kerja", "");
                map.put("Nama_unit_kerja", currentPosPendapatan);

            }
            if (currentNama.equalsIgnoreCase(map.get("jenisBiaya").toString())) {
                map.put("jenisBiaya", "");
//                map.put("jenisBiaya", currentNama);
            } else {
                currentNama = map.get("jenisBiaya").toString();
//                map.put("jenisBiaya", "");
                map.put("jenisBiaya", currentNama);
            }

        }
        return result;
    }

    public List<Map> listView(String tahun) {
        return ClassConnection.getJdbc().query("SELECT * FROM  ppmk.kunciAnggaranBiaya,ppmk.jenisBiaya,kamus.unkerja "
                + "WHERE  ppmk.jenisBiaya.kodeJenisBiaya=ppmk.kunciAnggaranBiaya.kodeJenisAnggaran AND "
                + "kamus.unkerja.Kd_unit_kerja=ppmk.kunciAnggaranBiaya.kodeUnit "
                + "and ppmk.kunciAnggaranBiaya.tahunAnggaran ='" + tahun + "'", new dtView());
    }

    protected class dtView implements RowMapper {

        public Object mapRow(ResultSet rs, int arg1) throws SQLException {
            KunciPenyusunanAnggaran x = new KunciPenyusunanAnggaran();
            x.setNmUnit(rs.getString("Nama_unit_kerja"));
            x.setNmJenisAnggaran(rs.getString("jenisBayar"));
            x.setIsRevisi(rs.getString("isRevisi"));
            return x;
        }
    }

    public List<Map> listJenisAnggaran() {
        return ClassConnection.getJdbc().query("select kodeJenisBiaya as kode, jenisBiaya as nama from ppmk.jenisBiaya", new dtNm());
    }

    protected class dtNm implements RowMapper {

        public Object mapRow(ResultSet rs, int arg1) throws SQLException, SQLException {
            KunciPenyusunanAnggaran data = new KunciPenyusunanAnggaran();
            data.setKdJenisAnggaran(rs.getString("kode"));
            data.setNmJenisAnggaran(rs.getString("nama"));
            return data;
        }
    }

    public List<Map> list(String thn) throws Exception {
        return ClassConnection.getJdbc().queryForList(""
                + " SELECT * FROM  ppmk.kunciAnggaranBiaya,ppmk.jenisBiaya,kamus.unkerja  "
                + " WHERE  ppmk.jenisBiaya.kodeJenisBiaya=ppmk.kunciAnggaranBiaya.kodeJenisAnggaran AND "
                + " kamus.unkerja.Kd_unit_kerja=ppmk.kunciAnggaranBiaya.kodeUnit "
                + " and ppmk.kunciAnggaranBiaya.tahunAnggaran = '" + thn + "'");
    }

    public void edit(KunciPenyusunanAnggaran data2) {
        // revised sarah (BAPSI) : 15-12-2009
        // revisiny cuma query sql ny ditampung dalam variabel sql aja,
        String sql = "update ppmk.kunciAnggaranBiaya "
                + "set isDikunci='" + ClassUtility.quote(data2.getIsDikunci()) + "' "
                + "where tahunAnggaran = '" + ClassUtility.quote(data2.getTahunAnggaran()) + "' "
                + "and kodeUnit='" + ClassUtility.quote(data2.getKodeUnit()) + "' "
                + "and kodeJenisAnggaran='" + ClassUtility.quote(data2.getKdJenisAnggaran()) + "' "
                + "and isRevisi = '" + ClassUtility.quote(data2.getIsRevisi()) + "'"
                + ";";
        ClassConnection.getJdbc().execute(sql);
    }

    /**
     * Digunakan untuk melakukan pengubahan data pada tabel ppmk.kunciAnggaranBiaya
     * berdasarkan tahunAnggaran,kodeUnit,kodeJenisAnggaran
     * @param data1
     * @throws Exception
     */
    public void update(KunciPenyusunanAnggaran data1) throws Exception {
        ClassConnection.getJdbc().execute("update ppmk.kunciAnggaranBiaya "
                + "set isRevisi='" + ClassUtility.quote(data1.getIsRevisi()) + "', "
                + "isDikunci='" + ClassUtility.quote(data1.getIsDikunci()) + "' "
                + "where tahunAnggaran = '" + ClassUtility.quote(data1.getTahunAnggaran()) + "' "
                + "and kodeUnit='" + ClassUtility.quote(data1.getKodeUnit()) + "' "
                + "and kodeJenisAnggaran='" + ClassUtility.quote(data1.getKdJenisAnggaran()) + "'");
    }

    /**
     * Digunakan untuk melakukan penyimpanan data kedalam tabel ppmk.kunciPenyusunanAnggaran
     * @param data3
     * @throws Exception
     */
    public void insert(KunciPenyusunanAnggaran data3) throws Exception {
        ClassConnection.getJdbc().execute("insert  into ppmk.kunciAnggaranBiaya "
                + "(tahunAnggaran,kodeUnit,kodeJenisAnggaran,isRevisi,isDikunci) "
                + "values "
                + "('" + ClassUtility.quote(data3.getTahunAnggaran()) + "',"
                + "'" + ClassUtility.quote(data3.getKodeUnit()) + "',"
                + "'" + ClassUtility.quote(data3.getKdJenisAnggaran()) + "',"
                + "'" + ClassUtility.quote(data3.getIsRevisi()) + "',"
                + "'" + ClassUtility.quote(data3.getIsDikunci()) + "')");
    }
}
